package com.example.demo.controller;

import com.example.demo.common.ResultAjax;
import com.example.demo.common.SessionUtils;
import com.example.demo.model.Articleinfo;
import com.example.demo.model.Userinfo;
import com.example.demo.model.vo.UserinfoVO;
import com.example.demo.service.ArticleService;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

@RestController
@RequestMapping("/art")
public class ArticleController {
    @Autowired
    private ArticleService articleService;

    private static final int _DESC_LENGTH=120;  //简介长度

    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;

    @Autowired
    private UserService userService;

    //得到当前登录用户的文章列表
    @RequestMapping("/mylist")
    public ResultAjax myList(HttpServletRequest request){
        //1、得到当前登录用户
        Userinfo userinfo= SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-1,"请先登录");
        }
        //2、根据用户id查询此用户发表的所有文章
        List<Articleinfo> list=articleService.getListByUid(userinfo.getId());
        //处理list:将文章正文变为简介
        if(list!=null&&list.size()>0){
            //并行处理list集合
            list.stream().parallel().forEach((art)->{
                if(art.getContent().length()>120){
                    art.setContent(art.getContent().substring(0,_DESC_LENGTH));
                }
            });
        }
        //3、返回给前端
        return ResultAjax.succ(list);
    }

    //删除文章
    @RequestMapping("/del")
    public ResultAjax del(Integer aid,HttpServletRequest request){
        //1、参数效验
        if(aid==null||aid<=0){
            return ResultAjax.fail(-1,"参数有误");
        }
        //2、得到当前登录的用户
        Userinfo userinfo=SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-1,"请先登录");
        }
        //3、判断文章的归属人+删除操作
        int result=articleService.del(aid,userinfo.getId());
        //4、将结果返回给前端
        return ResultAjax.succ(result);
    }

    //添加文章
    @RequestMapping("/add")
    public ResultAjax add(Articleinfo articleinfo,HttpServletRequest request){
        //1、效验参数
        if(articleinfo==null||!StringUtils.hasLength(articleinfo.getTitle())||
            !StringUtils.hasLength(articleinfo.getContent())){
            return ResultAjax.fail(-1,"非法参数");
        }
        //2、组装数据
        Userinfo userinfo=SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-2,"请先登录");
        }
        articleinfo.setUid(userinfo.getId());
        //3、将数据入库
        int result=articleService.add(articleinfo);
        //4、将结果返回给前端
        return ResultAjax.succ(result);
    }

    //查询自己发表的文章详情
    @RequestMapping("/update_init")
    public ResultAjax updateInit(Integer aid,HttpServletRequest request){
        //1、参数效验
        if(aid==null||aid<=0){
            return ResultAjax.fail(-1,"参数有误");
        }
        //2、得到当前登录用户id
        Userinfo userinfo=SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-2,"请先登录");
        }
        //3、查询文章并效验权限
        Articleinfo articleinfo=articleService.getArticleByIdAndUid(aid,userinfo.getId());
        //4、将结果返回给前端
        return ResultAjax.succ(articleinfo);
    }

    //修改文章信息
    @RequestMapping("/update")
    public ResultAjax update(Articleinfo articleinfo,HttpServletRequest request){
        //1、参数效验
        if(articleinfo==null||
                !StringUtils.hasLength(articleinfo.getTitle())||
                !StringUtils.hasLength(articleinfo.getContent())
                || articleinfo.getId()==0){
            return ResultAjax.fail(-1,"非法参数");
        }
        //2、获取登录用户
        Userinfo userinfo=SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-2,"请先登录");
        }
        articleinfo.setUid(userinfo.getId());
        //3、修改文章并效验归属人
        int result=articleService.update(articleinfo);
        //4、返回结果
        return ResultAjax.succ(result);
    }

    //查询文章详情页
    @RequestMapping("/detail")
    public ResultAjax detail(Integer aid) throws ExecutionException, InterruptedException {
        //1、参数效验
        if(aid==null||aid<=0){
            return ResultAjax.fail(-1,"非法参数");
        }
        //2、查询文章详情
        Articleinfo articleinfo=articleService.getDetail(aid);
        if(articleinfo==null||articleinfo.getId()<=0){
            return ResultAjax.fail(-1,"非法参数");
        }
        //3、根据uid查询用户的详情
        FutureTask<UserinfoVO> usrTask=new FutureTask(()->{
            return userService.getUserById(articleinfo.getUid());
        });
        taskExecutor.submit(usrTask);
        //4、根据uid查询用户发表的总文章数
        FutureTask<Integer> artCountTask=new FutureTask<>(()->{
            return articleService.getArtCountByUid(articleinfo.getUid());
        });
        taskExecutor.submit(artCountTask);
        //5、组装数据
        UserinfoVO userinfoVO=usrTask.get();    //等待线程池执行完成
        int artCount=artCountTask.get();
        userinfoVO.setArtCount(artCount);
        HashMap<String,Object> result=new HashMap<>();
        result.put("user",userinfoVO);
        result.put("art",articleinfo);
        //6、返回结果给前端
        return ResultAjax.succ(result);
    }

    //阅读量
    @RequestMapping("/increment_rcount")
    public ResultAjax incrementRCount(Integer aid) {
        // 1.效验参数
        if (aid == null || aid <= 0) {
            return ResultAjax.fail(-1, "参数有误！");
        }
        // 2.更改数据库
        int result = articleService.incrementRCount(aid);
        // 3.返回结果
        return ResultAjax.succ(result);
    }

    //查询分页功能
    @RequestMapping("/getlistbypage")
    public ResultAjax getListByPage(Integer pindex,Integer psize) throws ExecutionException, InterruptedException {
        //1、加工参数
        if(pindex==null||pindex<1){
            //参数矫正
            pindex=1;
        }
        if(psize==null||psize<1){
            psize=2;
        }
        //2、并发进行文章列表和总页数的查询
        //查询分页列表数据
        int finalOffset=psize*(pindex-1);    //分页公式
        Integer finalPSize=psize;
        FutureTask<List<Articleinfo>> listTask=new FutureTask<>(()->{
            return articleService.getListByPage(finalPSize,finalOffset);
        });
        //查询总页数
        FutureTask<Integer> sizeTask=new FutureTask<>(()->{
            //得到总条数
            int totalCount=articleService.getCount();
            double sizeTemp=(totalCount*1.0)/(finalPSize*1.0);
            return (int)Math.ceil(sizeTemp);
        });
        taskExecutor.submit(listTask);
        taskExecutor.submit(sizeTask);
        //3、组装数据
        List<Articleinfo> list=listTask.get();
        int size=sizeTask.get();
        HashMap<String,Object> map=new HashMap<>();
        map.put("list",list);
        map.put("size",size);
        //4、将结果返回给前端
        return ResultAjax.succ(map);
    }
}
